Autoyaチェックリスト


概要

OverridePointsのこの項目をいい感じに改変できると良いと思う。特にセキュリティ的な部分で。



authentication handlers.


1.初回通信に使うバイナリキー、良い感じの形式のものを良い感じの暗号化して送るべき。

private IEnumerator OnBootAuthRequest(Action<Dictionary<string, string>, string> setHeaderAndDataToRequest)

{

    // set boot body data for Http.Post to server.(if empty, this framework use Http.Get for sending data to server.)

    var data = "some boot data";


    // set boot authentication header.

    var bootKey = AuthSettings.AUTH_BOOT;

    var base64Str = Base64.FromBytes(bootKey);


    var bootRequestHeader = new Dictionary<string, string> {

        {"Authorization", base64Str}

    };


    setHeaderAndDataToRequest(bootRequestHeader, data);

    yield break;

}



2.初回起動時のサーバからの通信に対して、クライアント側でチェックし、validかどうか判断すべき。validだったら、暗号化してtokenデータを保存する。

この例ではtokenしか保存していないが、refreshTokenも暗号化して保存する必要がある。

private IEnumerator OnBootAuthResponse(Dictionary<string, string> responseHeader, string data, Action<int, string> bootAuthFailed)

{

    var isValidResponse = true;

    if (isValidResponse)

    {

        Autoya.Persist_Update(AuthSettings.AUTH_STORED_FRAMEWORK_DOMAIN, AuthSettings.AUTH_STORED_TOKEN_FILENAME, data);

    }

    else

    {

        bootAuthFailed(-1, "failed to boot validation.");

    }

    yield break;

}



3.リフレッシュトークンの送信。保存してあるrefreshTokenを復号する必要がある。このコードではまんま保存しておいたtokenを送っているため、保存するところから変えないと行けない。

private IEnumerator OnTokenRefreshRequest(Action<Dictionary<string, string>, string> setHeaderToRequest)


    // set refresh body data for Http.Post to server.(if empty, this framework use Http.Get for sending data to server.)

    var data = "some refresh data";


    // return refresh token for re-authenticate.

    var refreshToken = Autoya.Persist_Load(AuthSettings.AUTH_STORED_FRAMEWORK_DOMAIN, AuthSettings.AUTH_STORED_TOKEN_FILENAME);


    var base64Str = Base64.FromString(refreshToken);


    var refreshRequestHeader = new Dictionary<string, string> {

        {"Authorization", base64Str}

    };


    setHeaderToRequest(refreshRequestHeader, data);

    yield break;

}



4.リフレッシュトークンの受信。validationしてOKだったら、新たに得たtokenとrefreshTokenを暗号化して保存。

private IEnumerator OnTokenRefreshResponse(Dictionary<string, string> responseHeader, string data, Action<int, string> refreshFailed)

{

    var isValidResponse = true;

    if (isValidResponse)

    {

        Autoya.Persist_Update(AuthSettings.AUTH_STORED_FRAMEWORK_DOMAIN, AuthSettings.AUTH_STORED_TOKEN_FILENAME, data);

    }

    else

    {

        // failsafe here.



        // set result as failure.

        refreshFailed(-1, "failed to refresh token.");

    }


    yield break;

}



authorized http request & response handlers.


5.JWTなどのdigest生成を行うのはここ。

private Dictionary<string, string> OnHttpRequest(string method, string url, Dictionary<string, string> requestHeader, string data)

{

    var accessToken = Autoya.Persist_Load(AuthSettings.AUTH_STORED_FRAMEWORK_DOMAIN, AuthSettings.AUTH_STORED_TOKEN_FILENAME);

    requestHeader["Authorization"] = Base64.FromString(accessToken);


    return requestHeader;

}



6.レスポンスに対してのチェックを行うのはここ。(string)

private bool OnValidateHttpResponse(string method, string url, Dictionary<string, string> responseHeader, string data, out string reason)

{

    // let's validate http response if need.

    var isValid = true;

    if (isValid)

    {

        reason = string.Empty;

        return true;

    }

    else

    {

        reason = "run over by a bicycle.";

        return false;

    }

}



7.レスポンスに対してのチェックを行うのはここ。(byte[])

private bool OnValidateHttpResponse(string method, string url, Dictionary<string, string> responseHeader, byte[] data, out string reason)

{

    // let's validate http response if need.

    var isValid = true;

    if (isValid)

    {

        reason = string.Empty;

        return true;

    }

    else

    {

        reason = "run over by a bicycle.";

        return false;

    }

}



purchase feature handlers.


8.サーバ側が最新状態を持っているので、必要があれば課金関連のパラメータを更新する。

private void onPaidPurchaseDoneInBackground(string backgroundPurchasedProductId)

{

    // server deployed some products for this player. update player's parameter if need.

}



AssetBundles handlers.


9.リストを保存する際に暗号化すると良い。

private AssetBundleList[] LoadAssetBundleListsFromStorage()

{

    // load stored assetBundleList then return it.

    var filePaths = Autoya.Persist_FileNamesInDomain(AssetBundlesSettings.ASSETBUNDLES_LIST_STORED_DOMAIN);

    return filePaths.Select(

        path => JsonUtility.FromJson<AssetBundleList>(

            Autoya.Persist_Load(

                AssetBundlesSettings.ASSETBUNDLES_LIST_STORED_DOMAIN, Path.GetFileName(path)

            )

        )

    ).ToArray();

}



10.リストを更新する際、暗号化すると良い。

private bool StoreAssetBundleListToStorage(AssetBundleList list)

{

    var listStr = JsonUtility.ToJson(list);

    var result = _autoyaFilePersistence.Update(AssetBundlesSettings.ASSETBUNDLES_LIST_STORED_DOMAIN, list.identity, listStr);

    return result;

}



11.AssetBundleListのGet時に発効。CDNに何かしらアクセス保護を仕込んである場合、ここでパラメータを入れる。

private Dictionary<string, string> OnAssetBundleListGetRequest(string url, Dictionary<string, string> requestHeader)

{

    return requestHeader;

}



12.PreloadListのGet時に発効。CDNに何かしらアクセス保護を仕込んである場合、ここでパラメータを入れる。

private Dictionary<string, string> OnAssetBundlePreloadListGetRequest(string url, Dictionary<string, string> requestHeader)

{

    return requestHeader;

}



13.AssetBundleのGet時に発効。CDNに何かしらアクセス保護を仕込んである場合、ここでパラメータを入れる。

private Dictionary<string, string> OnAssetBundleGetRequest(string url, Dictionary<string, string> requestHeader)

{

    return requestHeader;

}



ApplicationManifest handlers.


14.RuntimeManifestの上書き。暗号化すると良い。

private bool OnOverwriteRuntimeManifest(string data)

{

    return _autoyaFilePersistence.Update(AppSettings.APP_STORED_RUNTIME_MANIFEST_DOMAIN, AppSettings.APP_STORED_RUNTIME_MANIFEST_FILENAME, data);

}



15.RuntimeManifestの取り出し。復号化すると良い。

private string OnLoadRuntimeManifest()

{

    return _autoyaFilePersistence.Load(AppSettings.APP_STORED_RUNTIME_MANIFEST_DOMAIN, AppSettings.APP_STORED_RUNTIME_MANIFEST_FILENAME);

}